using System; using Ink.Runtime; using UnityEngine; using UnityEngine.UI; // This is a super bare bones example of how to play and display a ink story in Unity. public class BasicInkExample : MonoBehaviour { public static event Action<Story> OnCreateStory; void Awake () { // Remove the default message RemoveChildren(); StartStory(); } // Creates a new Story object with the compiled story which we can then play! void StartStory () { story = new Story (inkJSONAsset.text); if(OnCreateStory != null) OnCreateStory(story); RefreshView(); } // This is the main function called every time the story changes. It does a few things: // Destroys all the old content and choices. // Continues over all the lines of text, then displays all the choices. If there are no choices, the story is finished! void RefreshView () { // Remove all the UI on screen RemoveChildren (); // Read all the content until we can't continue any more while (story.canContinue) { // Continue gets the next line of the story string text = story.Continue (); // This removes any white space from the text. text = text.Trim(); // Display the text on screen! CreateContentView(text); } // Display all the choices, if there are any! if(story.currentChoices.Count > 0) { for (int i = 0; i < story.currentChoices.Count; i++) { Choice choice = story.currentChoices [i]; Button button = CreateChoiceView (choice.text.Trim ()); // Tell the button what to do when we press it button.onClick.AddListener (delegate { OnClickChoiceButton (choice); }); } } // If we've read all the content and there's no choices, the story is finished! else { Button choice = CreateChoiceView("End of story.\nRestart?"); choice.onClick.AddListener(delegate{ StartStory(); }); } } // When we click the choice button, tell the story to choose that choice! void OnClickChoiceButton (Choice choice) { story.ChooseChoiceIndex (choice.index); RefreshView(); } // Creates a textbox showing the the line of text void CreateContentView (string text) { Text storyText = Instantiate (textPrefab) as Text; storyText.text = text; storyText.transform.SetParent (canvas.transform, false); } // Creates a button showing the choice text Button CreateChoiceView (string text) { // Creates the button from a prefab Button choice = Instantiate (buttonPrefab) as Button; choice.transform.SetParent (canvas.transform, false); // Gets the text from the button prefab Text choiceText = choice.GetComponentInChildren<Text> (); choiceText.text = text; // Make the button expand to fit the text HorizontalLayoutGroup layoutGroup = choice.GetComponent <HorizontalLayoutGroup> (); layoutGroup.childForceExpandHeight = false; return choice; } // Destroys all the children of this gameobject (all the UI) void RemoveChildren () { int childCount = canvas.transform.childCount; for (int i = childCount - 1; i >= 0; --i) { Destroy (canvas.transform.GetChild (i).gameObject); } } [SerializeField] private TextAsset inkJSONAsset = null; public Story story; [SerializeField] private Canvas canvas = null; // UI Prefabs [SerializeField] private Text textPrefab = null; [SerializeField] private Button buttonPrefab = null; }